from random import randint
from time import sleep

#下一步任务：制作二氧化碳





#定义词典{卡牌：数量}
#card={'水':15,'浓硫酸':15,'盐酸':15,'碳酸':10,'氢氧化钙':30,'氢氧化钠':10,'氨气':10,'一氧化二氮':5,'氧气':15,'氮气':10,'钾':5,'氯化钡':2,'无水硫酸铜':2,}
card={'水':15,'盐酸':15,'浓硫酸':15,'氢氧化钙':20,'氢氧化钠':10,'氧气':10}
#初始化牌桌
hand=[]
defend=[]
judgement=[]
HP=3

#初始化人机
handR=[]
defendR=[]
judgementR=[]
HPR=3

#初始化牌堆
new=[]
newNum=[]
#————————函数定义区域————————

#定义整理牌堆函数
def makeUp():
    global new,newNum

    for key in card.keys():
        new.append(key)

    for value in card.values():
        newNum.append(value)
makeUp()




#卡牌总数
totalNum=0

#计算总数函数
def count():
    global newNum,totalNum
    for value in newNum:
        totalNum+=value
count()
print('共有%d张牌'%totalNum)






#定义摸牌函数
def catch():
    global totalNum

    #判断牌堆是否有牌，否则重新洗牌
    if totalNum==0:
        makeUp()
        count()

    num=randint(1,totalNum)
    n=0
    while num-newNum[n]>0:
        num-=newNum[n]
        n+=1
    totalNum-=1
    newNum[n]-=1
    return new[n]


#判定函数
def judge():
    return randint(1,4)





#判断胜负函数
def winLose():
    if HP<=0:
        try:
            hand.index('氧气')
        except:
            print('你输了！')
            while True:
                pass
        else:
            sleep(0.5)
            O2()
            winLose()
    if HPR<=0:
        try:
            handR.index('氧气')
        except:
            print('你赢了！')
            while True:
                pass
        else:
            sleep(0.5)
            O2(R=True)
            winLose()



#展示玩家手牌函数
def showHandCard(player=''):
    global hand,handR
    print('你的手牌：',end='')
    if player=='':
        for n in hand:
            print(n,end=',')
    else:
        for n in handR:
            print(n,end=',')
    print('\n')



#出牌反应函数
def putout(outaim):

    global hand,HP


    while True:

        out=input('输入要打出的物质（输入数字0以跳过出牌）：')


        try:
        #输入数字0以跳过出牌
            if int(out)==0:

                return False
            else:
                print('输入有误',end=',')
        except:

                #打出手牌是否存在的侦测
            try:
                hand.index(out)
            except:
                print('输入有误',end=',')
            else:

                
                #侦测是否能反应
                try:
                    outaim.index(out)
                    
                except:
                    print('反应失败')
                else:
                    hand.pop(hand.index(out))
                    print('反应成功')
                    return True


#人机出牌反应函数
def putoutR(outaim):
    global handR,HPR

    try:
        for i in outaim:
            try:
                out=handR.pop(handR.index(i))
                print('对方使用%s反应'%out)
                return True
            except:
                continue
    except:
        pass
    return False

    
#侦测人机是否持有某手牌函数
def check(obj):
    try:
        handR.index(obj)
    except:
        return False
    else:
        return True

    


#————定义元素牌功能————
#盐酸
#参数R:False为玩家，True为人机
def HCl(R=False):

    global handR,hand,HPR,HP,killTime

    if R:
            killTime+=1
            print('对方打出了%s'%'盐酸')

            handR.pop(handR.index('盐酸'))

            #反应失败，该罚
            if putout(['氢氧化钙','氢氧化钠'])==False:
                HP-=1
                print('你受到1点伤害')
                print('你的血量:%d'%HP)
                winLose()

                 
                 

    else:
        if killTime==0:
            killTime+=1
            hand.pop(hand.index('盐酸'))
            showHandCard()

            print('等待对方出牌……')
            sleep(1)
            if putoutR(['氢氧化钙','氢氧化钠'])==False:
                HPR-=1
                print('对方受到1点伤害')
                print('对手血量:%d'%HPR)
                winLose()




        else:
            print('你已经出过【杀】')


#水
def H2O(R=False):
    global wet
    wet=True
    if R:
        print('对方打出了%s，你湿透了！'%'水')
        handR.pop(handR.index('水'))
    else:
        hand.pop(hand.index('水'))
        print('对方湿透了！')


def H2SO4(R=False):
    global handR,hand,HPR,HP,killTime,wet

    if R:
            killTime+=1
            print('对方打出了%s'%'浓硫酸')

            handR.pop(handR.index('浓硫酸'))

            harm=1
            if wet==True:
                wet=False
                harm+=1


            if putout(['氢氧化钙','氢氧化钠'])==False:
                HP-=harm
                print('你受到%d点伤害'%harm)
                print('你的血量:%d'%HP)
                winLose()

    else:
        if killTime==0:
            killTime+=1
            hand.pop(hand.index('浓硫酸'))
            showHandCard()

            print('等待对方出牌……')
            sleep(1)

            harm=1
            if wet==True:
                wet=False
                harm+=1

            if putoutR(['氢氧化钙','氢氧化钠'])==False:

                #判断是否有水
                #harm 为受到的伤害
                
                HPR-=harm
                print('对方受到%d点伤害'%harm)
                print('对手血量:%d'%HPR)
                winLose()



        else:
            print('你已经出过【杀】')

#氢氧化钠
def NaOH(R=False):
    global handR,hand,HPR,HP,killTime,wet


    if R:

        if wet==True:
            
                wet=False

                killTime+=1
                print('对方打出了%s'%'氢氧化钠')

                handR.pop(handR.index('氢氧化钠'))

                if putout(['浓硫酸','盐酸'])==False:
                    harm=2
                    HP-=harm

                    
                    print('你受到%d点伤害'%harm)
                    print('你的血量:%d'%HP)
                    winLose()

                    
        else:

            print('对方打出了%s'%'氢氧化钠')
            print('新增一张氢氧化钠于你的判断区内\n')

            handR.pop(handR.index('氢氧化钠'))

            judgement.append('氢氧化钠')


    else:

        if wet==True:

            if killTime==0:
                killTime+=1
                wet=False
                hand.pop(hand.index('氢氧化钠'))
                showHandCard()

                
                print('等待对方出牌……')
                sleep(1)

                
                if putoutR(['浓硫酸','盐酸'])==False:

                    harm=2
                    HPR-=harm
                    print('对方受到%d点伤害'%harm)
                    print('对手血量:%d'%HPR)
                    winLose()
            else:
                print('你已经出过【杀】')
                showHandCard()


        else:
            hand.pop(hand.index('氢氧化钠'))
            judgementR.append('氢氧化钠')
            print('新增一张氢氧化钠于对方判断区内\n')


def judgeNaOH(R=False):

    global HP,HPR,judgementR,judgement
    
    print('准备判定氢氧化钠：')
    print('若结果小于3，氢氧化钠吸收空气中水分')
    sleep(1)


    result=judge()
    print(result)

                
    if result<3:
        print('氢氧化钠在此潮解')
        harm=1
        if R:
            HPR-=harm
            print('对方受到%d点伤害'%harm)
            print('对手血量:%d'%HPR)

        else:
            HP-=harm
            print('你受到%d点伤害'%harm)
            print('你的血量:%d'%HP)


    if R:
        judgementR.pop(judgementR.index('氢氧化钠'))
    else:
        judgement.pop(judgement.index('氢氧化钠'))
    #弹出氢氧化钠

             
    winLose()
    sleep(1)



#氧气
def O2(R=False):
    global handR,hand,HPR,HP
    if R:
        print('对方猛吸了一口%s,血量+1'%'氧气')
        HPR+=1
        print('对手血量:%d'%HPR)
        handR.pop(handR.index('氧气'))

    else:
        if HP<3:
            print('你猛吸了一口%s,血量+1'%'氧气')
            HP+=1
            print('你的血量:%d'%HP)
            hand.pop(hand.index('氧气'))
        else:
            print('当前血量已满')

        
        
def CO2(R=False):
    global judgementR,judgement
    if R:
        judgementR.pop(judgementR.index('氢氧化钠'))
        print('对方喷成一口二氧化碳，清理掉其判定区内一张氢氧化钠')
        handR.pop(handR.index('二氧化碳'))
        

                
        


#————————函数定义区域（结束）————————
print('-------开始游戏--------')
print('初始摸牌阶段：')
#摸初始手牌
for n in range(4):
    hand.append(catch())
    handR.append(catch())

showHandCard()

sleep(1)
while True:

    #显示基本信息
    showHandCard()
    print('你的血量:%d'%HP)
    print('对手血量:%d'%HPR)

    print('你的回合：')
    killTime=0
    #对方潮湿状态
    wet=False

    #判定阶段
    if len(judgement)>0:
        print('\n判定阶段：')
        for i in range(len(judgement)):

            #列表长度决定判断次数
            
            if judgement[0]=='氢氧化钠':
                judgeNaOH(R=False)

    #摸两张
    for n in range(2):
        hand.append(catch())



    print('\n出牌阶段：')
    
    while True:
        #out表示打出的手牌
        showHandCard()
        out=input('输入要打出的手牌（输入数字0以结束出牌）：')

        #文字报错侦测
        try:
            #输入数字0以结束出牌
            if int(out)==0:
                break
            else:
                print('输入有误',end=',')
        except:

            #打出手牌是否存在的侦测
            try:
                hand.index(out)
            except:
                print('输入有误',end=',')
            else:
                if out=='盐酸':
                    HCl()
                elif out=='水':
                    H2O()
                elif out=='浓硫酸':
                    H2SO4()
                elif out=='氢氧化钠':
                    NaOH()
                elif out=='氧气':
                    O2()

                else:
                    print('无效牌')

    print('弃牌阶段：')
    while len(hand)>HP:

        #调试代码
        #break

        #out表示打出的手牌
        out=input('输入要弃置的手牌，你需要弃置%d张手牌：'%(len(hand)-HP))

        #被弃置手牌是否存在的侦测
        try:
            hand.pop(hand.index(out))
            showHandCard()
        except:
            print('输入有误',end=',')



    sleep(1)
    
    wet=False
    killTime=0

    print('对方回合：')

    if len(judgementR)>0:
        print('\n判定阶段：')
        for i in range(len(judgementR)):

            #列表长度决定判断次数
            
            if judgementR[0]=='氢氧化钠':
                judgeNaOH(R=True)

    for n in range(2):
        handR.append(catch())

        #插入值
        #用于侦测是否无牌可出
    handR.append(0)

        
    print('出牌阶段：')

    #出牌阶段

    
    br=1
    while br==1:
        #基本语句原理、结构
            #XX手牌是否存在
            #打出或跳过

        if killTime==0:
            if check('浓硫酸')==True:
                if check('水')==True:
                    H2O(R=True)
                    H2SO4(R=True)
                else:
                    H2SO4(R=True)
                continue
                
            if check('氢氧化钠')==True:
                if check('水')==True:
                    H2O(R=True)
                    NaOH(R=True)
                    continue
                
            if check('盐酸')==True:
                HCl(R=True)
                continue

        if check('氢氧化钠')==True:
            NaOH(R=True)
            continue
        
        if HPR<3:
            if check('氧气')==True:
                O2(R=True)
                continue
        
        if check(0)==True:
            br-=1
            handR.pop(len(handR)-1)
                    


    print('弃牌阶段：')
    sleep(1)
    while len(handR)>HPR:
        print('对方弃置了%s'%handR[0])
        handR.pop(0)
        sleep(1)
